#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<cstdlib>
#include<cstring>
using namespace std;

// void handle(int sign)
// {
//     cout << "get a gin, number: " << sign << endl;
//     alarm(2);
//     sleep(1);
// }

// int main()
// {
//     signal(SIGFPE, handle);
//     cout << "div begin:" << endl;
//     sleep(2);

//     int a = 10;
//     a /= 0;
    
//     cout << "div end:" << endl;
//     return 0;
// }

// int main()
// {
//     signal(SIGALRM, handle);

//     alarm(5);
//     while(true)
//     {
//         cout << "I am a process: " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;967
// }

// 信号保存部分

// int main()
// {
//     //signal(2, SIG_DFL); //默认动作
//     signal(2, SIG_IGN); //忽略

//     while(true)
//     {
//         cout << "I will get a sign" << endl;
//         sleep(1);
//     }
//     return 0;
// }

//测试：将某某信号阻塞，然后发送对应信号，观察pending表的变化

// void printpending(const sigset_t& pending)
// {
//     for(int i = 31; i >= 1; i--)
//     {
//         if(sigismember(&pending, i))
//             cout << 1;
//         else
//             cout << 0;
//     }
//     cout << endl << endl;
// }

// int main()
// {
//     //1、做数据的预备工作
//     sigset_t bset, oset;
//     sigemptyset(&bset); //全部置为0
//     sigemptyset(&oset);

//     sigaddset(&bset, 2); //设置2号信号为1

//     //2、将数据加载到内核中
//     sigprocmask(SIG_SETMASK, &bset, &oset); //屏蔽2号信号

//     //3、重复打印，观察现象：
//     sigset_t pending;
//     while(true)
//     {
//         int n = sigpending(&pending); //获取当前进程的pending表
//         if(n < 0) continue;

//         printpending(pending); //打印信号
//         sleep(1);
//     }
//     return 0;
// }

//测试：信号捕捉的接口：sigaction

void printpending()
{
    sigset_t pending;
    sigpending(&pending);

    for(int i = 31; i >= 1; i--)
    {
        if(sigismember(&pending, i)) cout << 1;
        else cout << 0;
    }
    cout << endl << endl;
}

void handler(int signo)
{
    //printpending(); //检测是在调用handler方法之前置空
    int cnt = 10;
    while(cnt--)
    {
        cout << "I get a signo : " << signo << endl;
        printpending();  //检测信号在处理时是否被阻塞
        sleep(1);
    }
}

int main()
{
    struct sigaction act, oact;
    memset(&act, 0, sizeof(struct sigaction));
    memset(&oact, 0, sizeof(struct sigaction));
    act.sa_handler = handler; //设置方法
    
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, 1); //添加屏蔽
    sigaddset(&set, 3);
    sigaddset(&set, 4);
    act.sa_mask = set; // 添加阻塞信号

    sigaction(2, &act, &oact);

    while(true)
    {
        cout << "I am a process pid : " << getpid() << endl;
        sleep(1);
    }

    return 0;
}